#pragma once

#include <iostream>
#include <string>
#include <pthread.h>
#include <functional>
#include <vector>
#include <queue>

typedef void*(*fun_t)(void*);  // 线程的执行函数

class ThreadData  // 线程的参数
{
public:
    void* _args;
    std::string _name;
};

class Thread  // 线程接口
{
public:
    Thread(int num, fun_t callback, void* args)
        :_func(callback)
    {
        // 创建线程的名称和执行方法的参数
        char nameBuffer[64];  // 线程的名称
        snprintf(nameBuffer, sizeof nameBuffer, "Thread - %d", num); // 把线程的名称写入数组中
        _name = nameBuffer; // 写好线程名称后给到类内成员
        
        _data._args = args;  // 线程的参数
        _data._name = _name; // 线程的名称
    }

    void start()  // 创建线程
    {
        pthread_create(&_tid, nullptr, _func, (void*)&_data);
    }

    void join()  // 线程等待
    {
        pthread_join(_tid, nullptr);
    }

    std::string name()  // 线程的名称
    {
        return _name;
    }

    ~Thread()
    {}
private:
    std::string _name; // 线程的名称
    pthread_t _tid;  // 线程的地址
    fun_t _func;  // 线程的执行函数
    ThreadData _data; // 线程的参数
};
